/**
 * https://juejin.cn/post/7039917386589437989
 * JS 实现一个带并发限制的异步调度器 保证同时最多运行两个
 * 
 * const scheduler = new Scheduler()
 * 
 * const timeout = time => {
  return new Promise(resolve => {
    setTimeout(resolve, time)
  }
})
 * const addTask = (time,order)=>{
 *    scheduler.add(() => timeout(time).then(()=>console.log(order))
 * 
 * }
 * addTask(1000, '1')
    addTask(500, '2')
    addTask(300, '3')
    addTask(400, '4')
    // output: 2 3 1 4
    整个的完整执行流程：
    起始1、2两个任务开始执行
    500ms时，2任务执行完毕，输出2，任务3开始执行
    800ms时，3任务执行完毕，输出3，任务4开始执行
    1000ms时，1任务执行完毕，输出1，此时只剩下4任务在执行
    1200ms时，4任务执行完毕，输出4
 * 
 */


class Scheduler {
    constructor(limit) {
        this.queue = [] //任务队列
        this.limit = limit; //最大限制
        this.runCount = 0; //当前执行的index

    }
    //添加任务
    add(time, order) {
        const pro = () => {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    console.log("打印顺序", order);
                    resolve()
                }, time);
            })
        }
        this.queue.push(pro)

        //可以直接在这里执行
        this.request()
    }

    // 执行任务
    request() {
        //判断当前任务执行最大数是否超过限制
        if (this.queue.length > 0 && this.runCount < this.limit) {
            const currentTask = this.queue.shift()

            this.runCount++ //当前的索引加1
            currentTask().then((result) => {
                this.runCount--
                this.request()
            })
        }
    }
}

const scheduler = new Scheduler(2)
const addTask = (time, order) => {
    scheduler.add(time, order)
}

addTask(1000, '1')
addTask(500, '2')
addTask(300, '3')
addTask(400, '4')